﻿using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Presentation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

#nullable enable

namespace PPTHelper.BLL.TimingRoot
{
    /// <summary>
    /// 序列时间节点
    /// </summary>
    public class SequenceContainer : TimeNodeContainer
    {
        /// <summary>
        /// 动画播放索引：序列容器是按顺序播放的，所以需要索引值，下一次触发时候知道该触发哪个动画。
        /// </summary>
        public int Index { get; set; }

        /// <summary>
        /// 执行下一个容器的触发条件列表
        /// </summary>
        public NextConditionList? NextConditionList { get; set; }

        /// <summary>
        /// 前一个触发条件列表
        /// </summary>
        public PreviousConditionList? PreviousConditionList { get; set; }

        /// <summary>
        /// 此属性指定是启用还是禁用并发。默认情况下，此属性具有值为“disabled”。
        /// 当该值设置为“enabled”时，将保留上一个元素在前进到序列中的下一个元素，
        /// 而不是结束时启用。这个仅与通过触发的下一个条件元素前进相关。
        /// 唯一的另一种前进到下一个元素的方法是让当前元素结束，这意味着它不再是并发的。
        /// </summary>
        public BooleanValue? Concurrent { get; set; }

        /// <summary>
        /// 此属性指定按顺序前进时要执行的操作。默认情况下属性的值为“none”。
        /// 当设置为seek时，它会将元素搜索到一个自然值结束时间（不一定是实际结束时间）。
        /// 自然终止位置定义为子对象的最新非无限终止时间。如果子循环是永远持续的，
        /// 其第一个循环的结束时间用作其“结束时间”，以便这个计算。
        /// 由于无限持续时间子元素，某些容器元素可以具有无限持续时间元素。
        /// 引擎需要在所有无限期容器中向下递归以计算他们的自然持续时间，
        /// 以防孩子可能有非无限的持续时间这需要加以考虑。
        /// </summary>
        public EnumValue<NextActionValues>? NextAction { get; set; }

        /// <summary>
        /// 文档里没有说明。
        /// </summary>
        public EnumValue<PreviousActionValues>? PreviousAction { get; set; }

        /// <summary>
        /// 按序列顺序执行一段动画
        /// </summary>
        public override void Run(TriggerInfo triggerInfo)
        {
            Console.WriteLine($"执行Sequence容器。Index=${Index}");

            //
            // 预先判断条件是否可以执行
            //

            TimeNodeList[Index++].Run(triggerInfo);
        }

        /// <summary>
        /// 默认构造
        /// </summary>
        public SequenceContainer()
        {
            // 默认从第一个动画开始播放
            Index = 0;
        }
    }
}
